package mi.payment.utils.transaction;

import android.text.TextUtils;

import java.util.Map;

import lainey.ui.utils.LogUtil;
import mi.payment.Constant;
import mi.payment.utils.iso8583.MsgField;
import mi.payment.utils.iso8583.Utils;
import mi.payment.utils.secure.TerminalSecure;

/**
 * 封装了根据上送的交易报文
 * 检查POS P返回的报文是否正确的逻辑
 * 返回报文有效性判断方法：
 * 1：判断是否有64域，如果有64域，进行mac判断
 * 2：判断消息类型，是否增加10
 * 3: 比较交易处理码，第一字节必须完全一致
 * 4: 比较流水号，必须完全一致
 * 5: 比较终端号，必须完全一致。
 * 6: 比较商户号，必须完全一致。
 * 7: 比较金额，如果不是部分扣款交
 * 易，需要完全一致。
 */
public class TransactionMsgChecker implements ReceiveMsgCheck {

    public String check(byte[] requestBytes, Map<String, MsgField> requestMap, byte[] responseBytes, Map<String, MsgField> responseMap) {
//        if (requestMap == null || responseMap == null) {
//            return "96";
//        }
//        if (responseBytes == null) {
//            return "12";
//        }
//
//        MsgField reqField;
//        MsgField respField;
//
//        // 1：判断是否有64域，如果有64域，进行mac判断
//        // 暂时注释 便于调试
//        String str = checkFieldF064(requestMap, responseMap, responseBytes);
//        if (str != null && str.length() > 0) {
//            return str;
//        }
//
//        // 2：判断消息类型，是否增加10
//        byte[] requestTypeBytes = new byte[2];
//        System.arraycopy(requestBytes, 13, requestTypeBytes, 0, 2);
//        String type = Utils.byte2HexStr(requestTypeBytes);
//        LogUtil.e(Constant.TAG, "消息类型 = " + type);
//
//        requestTypeBytes[1] = (byte) (requestTypeBytes[1] + 0x10);
//        String responseTypeStr = Utils.byte2HexStr(requestTypeBytes);
//        if (!responseMap.get("type").getDataStr().equals(responseTypeStr)) {
//            return "SE01";
//        }
//
//        // 3: 比较交易处理码，第一字节必须完全一致
//        reqField = requestMap.get("F003");
//        respField = responseMap.get("F003");
//        if (isTransTypeError(reqField, respField)) {
//            return "SE02";
//        }
//
//        // 4: 比较终端号，必须完全一致。
//        reqField = requestMap.get("F041");
//        respField = responseMap.get("F041");
//        if (reqField != null && isError(reqField, respField)) {
//            return "SE03";
//        }
//
//        // 5: 比较商户号，必须完全一致。
//        reqField = requestMap.get("F042");
//        respField = responseMap.get("F042");
//        if (reqField != null && isError(reqField, respField)) {
//            return "SE04";
//        }
//
//        // 6: 比较流水号，必须完全一致
//        reqField = requestMap.get("F011");
//        respField = responseMap.get("F011");
//        if (reqField != null && isError(reqField, respField)) {
//            return "SE05";
//        }
//
//        // 7: 比较金额，如果不是部分扣款交易，需要完全一致。
//        reqField = requestMap.get("F004");
//        respField = responseMap.get("F004");
//        if (isAmountError(reqField, respField)) {
//            return "SE06";
//        }

        return "00";
    }


    /**
     * 返回报文需要64域的Task，所有与钱有关的交易
     */
    private String checkFieldF064(Map<String, MsgField> requestMap, Map<String, MsgField> responseMap, byte[] responseBytes) {

        if (requestMap.containsKey("F064")) {
            LogUtil.e(Constant.TAG, " 该Task的返回报文需要64域 ");
            return checkF064Need(responseMap, responseBytes);
        } else {
            LogUtil.e(Constant.TAG, " 该Task的返回报文不需要64域 ");
            return checkNoF064(responseMap, responseBytes);
        }


    }

    /**
     * 按银联标准返回报文有64域
     */
    private String checkF064Need(Map<String, MsgField> responseMap, byte[] responseBytes) {
        MsgField F064 = responseMap.get("F064");
        LogUtil.d(Constant.TAG, " F064 null " + (F064 == null));
        if (F064 != null) {
            String F64_Value = F064.getDataStr();
            if (TextUtils.isEmpty(F64_Value)) {
                return "B6";
            } else {
                TerminalSecure.GenerateMAC(responseBytes);
                byte[] mac = new byte[8];
                System.arraycopy(responseBytes, responseBytes.length - 8, mac, 0, 8);
                String macStr = Utils.byte2HexStr(mac);
                LogUtil.e(Constant.TAG, "local mac:" + macStr + " posp mac:" + F64_Value);
                if (!macStr.equals(F64_Value))
                    return "B6";
            }
        } else {
            String str = responseMap.get("F039").getDataStr();
            if (!str.equals("00")) {
                return str;
            } else {
                return "B6";
            }
        }
        return "";
    }

    /**
     * 按银联标准返回报文没有64域
     *
     * @return
     */
    private String checkNoF064(Map<String, MsgField> responseMap, byte[] responseBytes) {
        //原代码的逻辑
        MsgField F064 = responseMap.get("F064");
        if (F064 != null) {
            String F64_Value = F064.getDataStr();
            if (TextUtils.isEmpty(F64_Value)) {
                return "B6";
            } else {
                TerminalSecure.GenerateMAC(responseBytes);
                byte[] mac = new byte[8];
                System.arraycopy(responseBytes, responseBytes.length - 8, mac, 0, 8);
                String macStr = Utils.byte2HexStr(mac);
                LogUtil.e(Constant.TAG, "local mac:" + macStr + " posp mac:" + F64_Value);
                if (!macStr.equals(F64_Value))
                    return "B6";
            }
        }
        return "";
    }


    private boolean isEmpty(MsgField field) {
        return field == null || field.getDataStr() == null;
    }

    private boolean isError(MsgField reqField, MsgField respField) {
        boolean empty = isEmpty(respField);
        if (empty) {
            return true;
        }
        return !isEmpty(reqField) && !reqField.getDataStr().equals(respField.getDataStr());
    }

    private boolean isAmountError(MsgField reqField, MsgField respField) {
        return !isEmpty(reqField) && !isEmpty(respField) && !reqField.getDataStr().equals(respField.getDataStr());
    }

    private boolean isTransTypeError(MsgField reqField, MsgField respField) {
        return !isEmpty(reqField) && !isEmpty(respField) && !reqField.getDataStr().substring(0, 2).equals(respField.getDataStr().substring(0, 2));
    }


}
